﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Pets.Abstract;
using System.IO;
namespace Pets.Concrete
{
    /// <summary>
    ///  Класс для загрузки\cохранения  List<Animal> из CVS файла
    /// </summary>
   public sealed class SerializerCVS : Serializer
   {
       #region Методы интерфейса

       public  override List<Animal> Load(string filename)
        {
            StreamReader st_read = new StreamReader(filename);
            List<Animal> animals = new List<Animal>();
            int index_animal = -1;
            string[] split_props;
            string line;
            while ((line = st_read.ReadLine()) != null)
            {
                split_props = line.Split(new char[] { ';' });
                index_animal++;
                if (split_props[0].Trim() == "Cat") animals.Add(new Cat());
                if (split_props[0].Trim() == "Dog") animals.Add(new Dog());
                for (int i = 1; i < split_props.Length-1; i++)
                {
                    if (split_props[i].Trim() == "null")
                    {
                        animals[index_animal].PetAviary = new Aviary();
                    }
                    else 
                    {
                        Type prop_type = animals[index_animal].GetType().GetProperties()[i - 1].GetType();
                        if (prop_type == typeof(System.String))
                        {
                            animals[index_animal].GetType().GetProperties()[i - 1].SetValue(animals[index_animal], split_props[i].Trim(), null);
                        }
                        if(prop_type == typeof(System.Int32))
                        {
                            animals[index_animal].GetType().GetProperties()[i - 1].SetValue(animals[index_animal], Convert.ToInt32(split_props[i].Trim()), null);
                        }
                    }
                }
            }
            st_read.Close();

            return animals;
        }

        public  override void Save(string source, List<Animal> list_animal)
        {
            StreamWriter st_write = new StreamWriter(source, false);

            ///<summary>
            /// Просмотр елементов в колекции list_animal
            ///</summary>
            foreach (Animal item in list_animal)
            {
                string out_string = "";
                out_string += item.ToString() + "; ";

                ///<summary>
                // Просмотр свойств item
                ///</summary>
                foreach (System.Reflection.PropertyInfo item_property in item.GetType().GetProperties())
                {
                    ///<summary>
                    // Если тип свойства PetAviary, то игнорируем 
                    ///</summary>
                    if (item_property.Name == "PetAviary")
                    {
                        out_string += "null; ";
                    }

                    ///<summary>
                    // Иначе установить свойство и добавить ; вконце
                    ///</summary>
                    else
                    {
                        out_string += item_property.GetValue(item, null) + "; ";
                    }
                }

                ///<summary>
                // Запись в файл
                ///</summary>
                st_write.WriteLine(out_string);
            }
            st_write.Close();
        }

       #endregion
   }
}
